package io.red;

import io.Archivo;
import io.Carpeta;
import io.Cliente;
import io.Mensaje;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 *
 * @author Mariano Zapata
 */
public class Conexion extends Thread {
    
    private Socket conexionObjeto;
    private Socket conexionArchivo;
    private GestorRed gr;
    private ObjectInputStream entradaObjeto;
    private ObjectOutputStream salidaObjeto;
    private BufferedInputStream entradaArchivo;
    private BufferedOutputStream salidaArchivo;
    private boolean vida;
    private boolean desconectando;
    
    public Conexion(String ip, int puertoObjeto, int puertoArchivo, GestorRed gr) throws IOException
    {
        super("Conexión cliente");
        this.gr= gr;
        conexionObjeto= new Socket(ip, puertoObjeto);
        conexionArchivo= new Socket(ip, puertoArchivo);
        salidaObjeto= new ObjectOutputStream(this.conexionObjeto.getOutputStream());
        entradaObjeto= new ObjectInputStream(this.conexionObjeto.getInputStream());
        salidaArchivo= new BufferedOutputStream(this.conexionArchivo.getOutputStream());
        entradaArchivo= new BufferedInputStream(this.conexionArchivo.getInputStream());
        vida= true;
        desconectando= false;
    }
    
    @Override
    public void run()
    {
        while (vida)
        {
            try {
                Mensaje m= (Mensaje) entradaObjeto.readObject();
                
                Carpeta resp= (Carpeta) m.obtenerCargaUtil();
                        for (Carpeta c : resp.getHijosCarpeta())
                            System.out.println(c.getNombre());
                        for (Cliente l : resp.getHijosCliente())
                            System.out.println(l.getApellido());
                        for (Archivo a : resp.getHijosArchivo())
                            System.out.println(a.getNombre());
                
                gr.mensajeRecibido(m);
            } catch (IOException ex) {vida= false;
                                      if (!desconectando)
                                          gr.errorConexion(ex.getMessage());}
              catch (ClassNotFoundException ex) {/*NADA*/}
        }
    }
    
    public void desconectar()
    {
        try {
            desconectando= true;
            conexionObjeto.close();
            conexionArchivo.close();
        } catch (IOException ex) {/*NADA*/}
    }
    
    public void enviarMensaje(Mensaje msj)
    {
        try {
            salidaObjeto.writeObject(msj);
            salidaObjeto.flush();
        } catch (IOException ex) {/*NADA*/}
    }
    
    public BufferedOutputStream obtenerSalidaArchivo() {return salidaArchivo;}
    
    public BufferedInputStream obtenerEntradaArchivo() {return entradaArchivo;}
}
